package cn.fl.tag.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.cmm.base.framework.context.ApplicationContextAccessor;
import cn.cmm.base.framework.exception.BaseException;
import cn.cmm.base.framework.utils.BaseLogUtils;
import cn.cmm.base.framework.utils.CollectionUtils;
import cn.cmm.base.framework.utils.StringUtils;
import cn.fl.framework.base.context.CurrentThreadContext;
import cn.fl.system.condition.SysPgCmpDtlQueryCondition;
import cn.fl.system.service.ISysPgInfoService;

/**
 * 根据业务类型和业务代码获取组件块-系统页面组件-业务关系
 * 返回的HTML串为一个完整的原子标签
 * input、 date、 数字 、 小数、文本都可以使用本类  
 * EVAL_BODY_INCLUDE：告诉服务器正文的内容，并把这些内容送入输出流 
 * SKIP_BODY：告诉服务器不要处理正文内容 
 * EVAL_PAGE：让服务器继续执行页面 
 * SKIP_PAGE：让服务器不要处理剩余的页面 
 * EVAL_BODY_AGAIN：让服务器继续处理正文内容，只有doAfterBody方法可以返回 
 * EVAL_BODY_BUFFERED：BodyTag接口的字段，在doStartTag()返回 
 * EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回，而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
 * @author FUJINGRUN
 */
public class UIAtomBizTag extends BodyTagSupport {

	private static final long serialVersionUID = 1582623044470859704L;

	private static final Logger logger = LoggerFactory.getLogger(UIAtomBizTag.class);
	
	/**
	 * 系统页面服务
	 */
	private ISysPgInfoService sysPgInfoService = (ISysPgInfoService)ApplicationContextAccessor.getBean("sysPgInfoServiceImpl");
	
	/**
	 * 页面代码
	 */
	private String pgCd;
	
	/**
	 * 组件代码
	 */
	private String cmpCd;
	
	/**
	 * 原子组件代码:如果是个集合,则用逗号分割,这里会解析
	 */
	private String cmpDtlCd;
	
	/**
	 * 组织架构集合代码
	 */
	private List<String> orgCds;
	
	/**
	 * 系统代码
	 */
	private String sysCd;
	
	/**
	 * 角色集合
	 */
	private List<Long> roleIds;
	
	/**
	 * 业务类型代码
	 */
	private String bizTypCd;
	
	/**
	 * 业务类型,如果是个集合,则用逗号分割,这里会解析
	 */
	private String bizCd;
	
	@Override
	public int doStartTag() throws JspException {
		//检查组织架构代码和系统代码是否有值,没有值则赋值当前组织架构
		if(CollectionUtils.isEmpty(orgCds)){
			orgCds = new ArrayList<>();
			orgCds.add(CurrentThreadContext.getCurrentOrgCd());
		}
		
		if(StringUtils.isBlank(sysCd)){
			sysCd = CurrentThreadContext.getCurrentSysCd();
		}
		
		if(CollectionUtils.isEmpty(roleIds)){
			roleIds = new ArrayList<>();
			roleIds.add(CurrentThreadContext.getCurrentRoleId());
		}
		
		SysPgCmpDtlQueryCondition condition = new SysPgCmpDtlQueryCondition();
		condition.setOrgCd(CurrentThreadContext.getCurrentOrgCd());//系统默认值,请区分业务传递的集合orgCds
		//DOTO 组件传递的系统代码无效,此处重新设置当前系统
		condition.setSysCd(CurrentThreadContext.getCurrentSysCd());
		condition.setRoleIds(roleIds);
		condition.setOrgCds(orgCds);
		condition.setPgCd(getPgCd());
		condition.setCmpCd(getCmpCd());
		condition.setCmpFldNmList(getCmpFldNmList());
		condition.setBizTypCd(getBizTypCd());
		//做一个转换
		condition.setBizCd(getBizCd());
		String html = null;
		try {
			if(StringUtils.isNotEmpty(getBizTypCd()) && StringUtils.isNotEmpty(condition.getBizCd())){
				html = this.sysPgInfoService.getSysPgCmpDtlWithBiz(condition);
			}
		} catch (BaseException e) {
			html = null;
		}catch (Exception e) {
			html = null;
		}
		
		if(StringUtils.isEmpty(html)){
			return EVAL_PAGE;//不处理正文内容
		}
		JspWriter out = this.pageContext.getOut();
		try {
			 out.print(html);
		} catch (IOException e) {
			BaseLogUtils.error(logger, "-", "异常", e);
		}
		return EVAL_BODY_INCLUDE;//继续执行
	}
	
	@Override
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}
	
	/**
	 * 获取字段名称集合
	 */
	private List<String> getCmpFldNmList(){
		List<String> cds = new ArrayList<>();
		String dtlCd = getCmpDtlCd();
		if(StringUtils.isEmpty(dtlCd)){
			return cds;
		}
		String [] dtlCdArray = dtlCd.split(",");
		for (String cd : dtlCdArray) {
			cds.add(cd);
		}
		return cds;
	}
	
	/**
	 * 页面代码
	 */
	public String getPgCd() {
		return pgCd;
	}

	/**
	 * 页面代码
	 */
	public void setPgCd(String pgCd) {
		this.pgCd = pgCd;
	}

	/**
	 * 组件代码
	 */
	public String getCmpCd() {
		return cmpCd;
	}

	/**
	 * 组件代码
	 */
	public void setCmpCd(String cmpCd) {
		this.cmpCd = cmpCd;
	}

	/**
	 * 原子组件代码
	 */
	public String getCmpDtlCd() {
		return cmpDtlCd;
	}

	/**
	 * 原子组件代码
	 */
	public void setCmpDtlCd(String cmpDtlCd) {
		this.cmpDtlCd = cmpDtlCd;
	}

	/**
	 * 系统代码
	 */
	public String getSysCd() {
		return sysCd;
	}

	/**
	 * 系统代码
	 */
	public void setSysCd(String sysCd) {
		this.sysCd = sysCd;
	}

	/**
	 * 组织架构代码集合
	 */
	public List<String> getOrgCds() {
		return orgCds;
	}

	/**
	 * 组织架构代码集合
	 */
	public void setOrgCds(List<String> orgCds) {
		this.orgCds = orgCds;
	}

	/**
	 * 角色集合
	 */
	public List<Long> getRoleIds() {
		return roleIds;
	}

	/**
	 * 角色集合
	 */
	public void setRoleIds(List<Long> roleIds) {
		this.roleIds = roleIds;
	}

	/**
	 * 业务类型代码
	 */
	public String getBizTypCd() {
		return bizTypCd;
	}

	/**
	 * 业务类型代码
	 */
	public void setBizTypCd(String bizTypCd) {
		this.bizTypCd = bizTypCd;
	}

	/**
	 * 业务类型
	 */
	public String getBizCd() {
		return bizCd;
	}

	/**
	 * 业务类型
	 */
	public void setBizCd(String bizCd) {
		this.bizCd = bizCd;
	}
}
